<%--
  Created by IntelliJ IDEA.
  User: 胡斌
  Date: 2021/7/4
  Time: 15:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" isELIgnored="false" %>
<%--如果使用 Core 标签库，首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%------------------------------------------------------核心标签库之通用标签-------------------------------------------------------%>
<%-- 1、<c:out>标签 --%>
<%--<c：out> 标签用来显示数据的内容，与 <%=表达式%> 或 ${表达式} 类似--%>
<c:out value="此标签用于输出内容到页面" default="默认输出内容"></c:out>
<br/>
或
<c:out value="此标签用于输出内容到页面">默认输出内容</c:out>
<%--其中，value 值可以是一个 EL 表达式，也可以是一个字符串；default 可有可无，当 value 值不存在时输出 defaultValue--%>
<c:out value="${param.data}" default="没有数据"/>

<%--2、<c：set>标签--%>
<%--1）设置作用域变量：用户可以使用 <c：set> 在 page、request、session、application 等范围内设置一个变量--%>
<%--格式：<c:set value="value" var="varName"[scope="page|request|session|application"]/>该代码将 value 值赋给变量 varName--%>
<c:set value="zhao" var="userName" scope="session"/>
相当于
<%session.setAttribute("userName", "zhao");%>
<%--2）设置 JavaBean 的属性--%>
<%--格式：<c:set value="value" target="target" property="propertyName"/>--%>
<%--上面的代码将 value 值赋给 target 对象（JaveBean 对象）的 propertyName 属性。如果 target 为 null 或没有 set 方法则抛出异常。--%>

<%--3. <c：remove>标签--%>
<%--如果要删除某个变量，可以使用 <c：remove> 标签--%>
<c:remove var="userName" scope="session"/>
相当于
<%session.removeAttribute("userName");%>

<%--------------------------------------------------------核心标签库之流程控制标签--------------------------------------------%>
<%--1. <c：if> 标签--%>
<%--<c：if> 标签实现 if 语句的作用，具体语法格式如下:--%>
<c:if test="${cif==123}">
    <c:out value="条件为true时执行" default="条件为true时执行"/>
</c:if>
<%--其中，条件表达式可以是 EL 表达式，也可以是 JSP 表达式。如果表达式的值为 true，则会执行 <c：if> 的主体内容，
但是没有相对应的 <c：else> 标签。如果想在条件成立时执行一块内容，不成立时执行另一块内容，可以使用 <c：choose>、<c：when>
及 <c：otherwise> 标签。--%>

<%--2. <c：choose>、<c：when>及<c：otherw ise>标签--%>
<%--<c：choose>、<c：when> 及 <c：otherwise> 标签实现 if/elseif/else 语句的作用，具体语法格式如下：--%>
<c:choose>
    <c:when test="${choose==1}">
        主体内容1
    </c:when>
    <c:when test="${choose==2}">
        主体内容2
    </c:when>
    <c:otherwise>
        表达式都不正确时执行的主体内容
    </c:otherwise>
</c:choose>

<%--------------------------------------------------核心标签库之迭代标签-----------------------------------------------------%>
<%--1. <c：forEach> 标签--%>
<%--<c：forEach> 标签可以实现程序中的 for 循环。语法格式如下：--%>
<%--<c:forEach var="变量名" items="数组或Collection对象">循环体</c:forEach>--%>
<%--其中，items 属性可以是数组或 Collection 对象，每次循环读取对象中的一个元素，并赋值给 var 属性指定的变量，
之后就可以在循环体中使用 var 指定的变量获取对象的元素。--%>
<table>
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <c:forEach var="user" items="${requestScope.usersKey}">
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
        </tr>
    </c:forEach>
</table>
<%--在有些情况下需要为 <c：forEach> 标签指定 begin、end、step 和 varStatus 属性。begin 为迭代时的开始位置，默认值为 0。--%>
<%--end 为迭代时的结束位置，默认值是最后一个元素。--%>
<%--step 为迭代步长，默认值为 1。--%>
<%--varStatus 代表迭代变量的状态，包括 count（迭代的次数）、index（当前迭代的索引，第一个索引为0）、first（是否为第一个迭代对象）和 last（是否为最后一个迭代对象）。--%>
<%--例如：--%>
<table border=1>
    <tr>
        <th>Value</th>
        <th>Square</th>
        <th>Index</th>
        <th>Count(迭代次数，迭代运行的次数)</th>
    </tr>
    <c:forEach var="x" varStatus="status" begin="0" end="10" step="2">
        <tr>
            <td>${x}</td>
            <td>${x*x}</td>
            <td>${status.index}</td>
            <td>${status.count}</td>
        </tr>
    </c:forEach>
</table>

<%--2. <c：forTokens> 标签--%>
<%--<c：forTokens> 用于迭代字符串中由分隔符分隔的各成员，它通过 java.util.StringTokenizer 实例来完成字符串的分隔，
属性 items 和 delims 作为构造 StringTokenizer 实例的参数。语法格式如下：--%>
<%--<c:forTokens var="变量名" items="要迭代的String对象" delims="指定分隔字符串的分隔符">循环体</c:forTokens>--%>
<c:forTokens var="name" items="chenheng1:chenheng2:chenheng3" delims=":">
    ${name}<br>
</c:forTokens>
<%--<c：forTokens> 标签与 <c：forEach> 标签一样，也有 begin、end、step 和 varStatus 属性，并且用法相同--%>
</body>
</html>
